package algo3.grupo3.modelo;


public class Bomba extends ObjetoAnimado implements DependienteDelTiempo,Cloneable  {
	
	
	private int magnitudExplosion;
	/*representa la cantidad de casilleros que la explosion puede expandirse */
	
	private int poderExplosion;
	/*representa el danio que esta bomba puede ocasionar a un ObjetoAnimado */
	
	private double delayExplosion;
	//tiempo que demora en explotar una bomba desde el momento que es colocada
	
	private double cronometroBomba=0.0;
	//temporizador de bomba. cronometroBomba > delayExplosion -> Bomba>> explotar
	
	private EstrategiaExplosion manejadorExplosion= null;
	//controla la forma de explotar de la bomba
	
	public final static int PODER_MOLOTOV = 5;
	public final static int PODER_TOLE_TOLE = 20; /*representa un poder mayor*/
	public final static int MAGNITUD_MOLOTOV = 3;
	public final static int MAGNITUD_TOLE_TOLE = 6;
	public final static double DELAY_MOLOTOV = 3000;//medido en milisegundos , antes 2000
	public final static double DELAY_TOLE_TOLE = 5000;
	public static final int MAGNITUD_BOMBA_ENEMIGO = 3;
	public static final int PODER_BOMBA_ENEMIGO = 1;
	public static final double DELAY_BOMBA_ENEMIGO = 4000;//antes 3200
	
	public static final int MOLOTOV= 0;
	public static final int TOLE_TOLE= 1;
	public static final int ENEMIGO= 2;
	public static final int MEDIA_BOMBA= 3;
	public static final int OTRA= 4;
	
	public int tipoBomba;
	
	
	public void convertirAMolotov(){
		this.magnitudExplosion= MAGNITUD_MOLOTOV;
		this.poderExplosion= PODER_MOLOTOV;
		this.delayExplosion= DELAY_MOLOTOV;
		this.manejadorExplosion= new ExplosionEnCruz();
		this.tipoBomba= MOLOTOV;
	}//fin de convertirAMolotov
	
	public void convertirAToleTole(){
		this.magnitudExplosion = MAGNITUD_TOLE_TOLE;
		this.poderExplosion = PODER_TOLE_TOLE;
		this.delayExplosion = DELAY_TOLE_TOLE;
		this.manejadorExplosion= new ExplosionToleTole();
		this.tipoBomba= TOLE_TOLE;
	}//fin de convertirAToleTole
	
	public void convertirAMediaBomba(){
		this.convertirAMolotov();
		this.manejadorExplosion= new ExplosionMediaBomba();
		this.tipoBomba= MEDIA_BOMBA;
	}//fin de convertrirAMediaBomba
	
	
	public Bomba( Casilla posicion, EstrategiaExplosion me){
		
		this.durabilidad= 1;//una bomba es facilmente destruible
		this.posicion= posicion;
		this.cambiarEstrategiaExplosion(me);
		this.convertirAMolotov();//supongo que inicialmente toda bomba es como una molotov
		posicion.ocupar(this);
		
	}//fin de constructor	
	
	public Bomba(Casilla posicion){
		
		this.durabilidad= 1;
		this.posicion= posicion;
		this.manejadorExplosion= new ExplosionEnCruz();
		this.convertirAMolotov();
		posicion.ocupar(this);
		
	}//fin de constructor
	
	public Bomba(){
		
		this.durabilidad= 1;
		this.manejadorExplosion= new ExplosionEnCruz();
		this.convertirAMolotov();		
		
	}//fin de constructor
	
	public Bomba(Bomba otraBomba){
		
		this.durabilidad = 1;
		this.posicion = otraBomba.posicion;
		this.manejadorExplosion= otraBomba.manejadorExplosion;
		this.magnitudExplosion= otraBomba.magnitudExplosion;
		this.poderExplosion= otraBomba.poderExplosion;
		this.delayExplosion= otraBomba.delayExplosion;
		this.tipoBomba= otraBomba.tipoBomba;
		
	}//fin de constructor
	
	
	public void actualizarEstado( double tiempoCiclo ){
		
		cronometroBomba += tiempoCiclo;
		if(cronometroBomba >= delayExplosion)
			this.explotar();
		
		
		
	}//fin de actualizarCronometro
	/*metodo que actualizara el estado de cronometroBomba. */
	
	
	public void explotar()  {
		
			this.manejadorExplosion.explotar(this.posicion, this.magnitudExplosion, this.poderExplosion);
		
		this.resetearCronometro();
		posicion.removerOcupanteSuperpuesto();
		
		if(this.posicion.tieneOcupantePrincipal())
			this.posicion.expandirExplosion(poderExplosion);
		this.destruir();
		
	}//fin de explotar
	
	public double obtenerDelayExplosion(){
		return this.delayExplosion;
	}// fin de obtenerDelayExplosion
	
	public int obtenerPoderExplosion(){
		return this.poderExplosion;
	}//fin de obtenerPoderExplosion
	
	public int obtenerMagnitudExplosion(){
		return this.magnitudExplosion;
	}//fin de obtenerMagnitudExplosion
	
	public void cambiarDelayExplosion(double tiempo){
		if (tiempo <= 0) 
			return;
		this.delayExplosion = tiempo;
	}//fin de cambiarDelayExplosion
	
	public void cambiarPoderExplosion(int pe){
		if( pe < 0 )
			return;
		this.poderExplosion= pe;
	}//fin de cambiarPoderExplosion
	
	public void cambiarMagnitudExplosion(int me){
		if(me <= 0)
			return;
		this.magnitudExplosion=me;
	}//fin de cambiarMagnitudExplosion
	
	public void cambiarEstrategiaExplosion(EstrategiaExplosion me){
		if(me == null)
			return;
		this.manejadorExplosion = me;
	}//fin de cambiarManejadorExplosion
	
	
	
	@Override
	public boolean esAtravesable() {
		return true;
	}
	
	
	public Bomba clone(){
		
		Bomba retornar= new Bomba(this);
		
		return retornar;
	}//fin de clone
	
	public void resetearCronometro(){
		this.cronometroBomba= 0.0;
	}//fin de resetearCronometro

	public void convertirABombaEnemigo() {
		this.magnitudExplosion = MAGNITUD_BOMBA_ENEMIGO;
		this.poderExplosion = PODER_BOMBA_ENEMIGO;
		this.delayExplosion = DELAY_BOMBA_ENEMIGO;
		this.manejadorExplosion = new ExplosionEnCruz();
		this.tipoBomba= ENEMIGO;
	}//fin de convertirABombaEnemigo
	
	public int obtenerTipo(){
		return this.tipoBomba;
	}//fin de obtenerTipo
	
}//fin de Bomba
